package cn.tedu.weibo.controller;

import cn.tedu.weibo.common.response.ResultVO;
import cn.tedu.weibo.common.response.StatusCode;
import cn.tedu.weibo.mapper.UserMapper;
import cn.tedu.weibo.pojo.dto.UserLoginDTO;
import cn.tedu.weibo.pojo.dto.UserRegDTO;
import cn.tedu.weibo.pojo.entity.User;
import cn.tedu.weibo.pojo.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpSession;
import java.util.Date;

@RestController
@RequestMapping("/v1/users/")
@Api(tags = "01.用户模块")
public class UserController {
    // 自动装配(依赖查找DL，依赖注入-DI)
    @Autowired(required = false)
    private UserMapper userMapper;//饭来张口，衣来伸手

    /**注册功能*/
    @PostMapping("reg")
    @ApiOperation(value = "注册功能")
    public int reg(@RequestBody UserRegDTO userRegDTO){
        System.out.println("userRegDTO = " + userRegDTO);
        // 确认用户名是否被占用
        UserVO userVO = userMapper.selectByUsername(userRegDTO.getUsername());
        if (userVO != null){
            return 2; // 用户名被占用
        }

        // 存入user表：实体类
        User user = new User();
        BeanUtils.copyProperties(userRegDTO, user);
        user.setCreated(new Date());
        // 插入数据
        userMapper.insert(user);

        return 1;
    }

    /**登录功能*/
    @PostMapping("login")
    @ApiOperation(value = "登录功能")
    // 1.添加会话参数
    public int login(@RequestBody UserLoginDTO userLoginDTO, @ApiIgnore HttpSession session){
        System.out.println("userLoginDTO = " + userLoginDTO);
        UserVO userVO = userMapper.selectByUsername(userLoginDTO.getUsername());

        if (userVO != null){
            // 判断密码
            if (userVO.getPassword().equals(userLoginDTO.getPassword())){
                // 2.将该用户的登录状态的会话保存起来
                session.setAttribute("user", userVO);
                return 1; // 登录成功
            }
            return 2; // 密码错误
        }
        return 3; // 用户名不存在
    }

    /**获取当前用户登录状态*/
    @GetMapping(value="currentUser")
    @ApiOperation(value = "获取当前用户")
    public UserVO currentUser(HttpSession session){
        // 当前客户端的会话对象中取出登录的UserVO
        UserVO userVO = (UserVO) session.getAttribute("user");
        // 如果登录过，返回userVO对象，否则返回null
        return userVO;
    }

    /**退出登录功能*/
    @GetMapping("logout")
    @ApiOperation(value = "登出功能")
    public void logOut(HttpSession session){
        // 删除会话对象
        session.removeAttribute("user");
    }
    //=============
    /**登录功能*/
    @PostMapping("doLogin")
    @ApiOperation(value = "封装登录响应结果")
    // 1.添加会话参数
    public ResultVO doLogin(@RequestBody UserLoginDTO userLoginDTO, HttpSession session){
        System.out.println("userLoginDTO = " + userLoginDTO);
        UserVO userVO = userMapper.selectByUsername(userLoginDTO.getUsername());

        if (userVO != null){
            // 判断密码
            if (userVO.getPassword().equals(userLoginDTO.getPassword())){
                // 2.将该用户的登录状态的会话保存起来
                session.setAttribute("user", userVO);
                return new ResultVO(StatusCode.LOGIN_SUCCESS); // 登录成功
            }
            return new ResultVO(StatusCode.PASSWORD_ERROR); // 密码错误
        }
        return new ResultVO(StatusCode.USERNAME_ERROR); // 用户名不存在
    }
}










